/*
 * PositionObject.h
 *
 *  Created on: 02.10.2012
 *      Author: caffeine
 */

#ifndef __POSITIONOBJECT_H__
#define __POSITIONOBJECT_H__

#include <irrlicht.h>
#include <thread/IMutex.h>
#include <IReferenceCounted.h>
#include <ISerializationObject.h>

namespace irr{
namespace object{

/***
 * @class PositionObject
 * Класс реализующий работу с позицией объекта. Для удобства или нужды разрешается переопредилить методы
 * getPosition и setPosition своими. Класс безопасен для работы из разных потоков: не получится так что
 * один поток записывает значение поля position, а другой в это же время читат. По уму нужно его делать одним
 * из родителей того класса, которому нужно реализовать возможность устанавливать и получать позицию.
 */

class PositionObject:public virtual irr::IReferenceCounted,public virtual ISerializationObject{
private:
	irr::core::vector3df position;
	irr::thread::IMutex*position_lock;
protected:
	virtual irr::core::stringc getSerializationNodeName()=0;
public:
	PositionObject();
	PositionObject(irr::core::vector3df position);
	PositionObject(irr::f32 X,irr::f32 Y,irr::f32 Z);
	virtual ~PositionObject();

	virtual irr::core::vector3df getPosition();
	virtual irr::f32 getPositionX();
	virtual irr::f32 getPositionY();
	virtual irr::f32 getPositionZ();

	virtual void setPosition(irr::core::vector3df position);
	virtual void setPosition(irr::f32 X,irr::f32 Y,irr::f32 Z);

	virtual void setPositionX(irr::f32 X);
	virtual void setPositionY(irr::f32 Y);
	virtual void setPositionZ(irr::f32 Z);
	
	irr::f32 getDistanceSQ(irr::core::vector3df point);
	irr::f32 getDistanceSQ(PositionObject*object);
	irr::f32 getDistance(PositionObject*object);

	virtual void getSerialized(irr::xml::IXmlNode*node)=0;
	virtual irr::xml::TagResult setSerialized(irr::xml::IXmlNode*node)=0;
};

}//namespace object
}//namespace irr

#endif /* POSITIONOBJECT_H_ */
